 1.集群准备
   
   1).安装Hadoop,Hive
   Impala的安装需要提前装好Hadoop，Hive这两个框架(HDFS:impala数据存储在hdfs，Hive:Impala直接
使用Hive元数据管理数据)
   hive需要在所有的Impala安装的节点上⾯面都要有，因为Impala需要引⽤用Hive的依赖包，
   hadoop的框架需要⽀支持C程序访问接⼝口，查看下图，如果有该路路径有.so结尾⽂文件，就证明⽀支持C
接⼝口。
   2).准备Impala的所有依赖包
   Cloudera公司对于Impala的安装只提供了了rpm包没有提供tar包；所以我们选择使⽤用Cloudera的rpm包
进⾏行行Impala的安装，但是另外⼀一个问题，Impala的rpm包依赖⾮非常多的其他的rpm包，我们可以⼀一个个
的将依赖找出来，但是这种⽅方式实在是浪费时间。
   Linux系统中对于rpm包的依赖管理理提供了了⼀一个⾮非常好的管理理⼯工具叫做Yum类似于Java⼯工程中的包
管理工具Maven,Maven可以⾃自动搜寻指定Jar所需的其它依赖并自动下载来。Yum同理可以非常方便的让我
们进行rpm包的安装⽆无需关系当前rpm所需的依赖。但是与Maven下载其它依赖需要到中央仓库⼀一样
Yum下载依赖所需的源也是在放置在国外服务器并且其中没有安装Impala所需要的rpm包，所以默认的
这种Yum源可能下载依赖失败。所以我们可以⾃自⼰己指定Yum去哪⾥里里下载所需依赖。
   rpm⽅方式安装:需要⾃自⼰己管理理rpm包的依赖关系；⾮非常麻烦；解决依赖关系使⽤用yum；默认Yum源是没有
Impala的rpm安装包，所以我们⾃自⼰己准备好所有的Impala安装所需的rpm包，制作Yum本地源，配置
Yum命令去到我们准备的Yun源中下载Impala的rpm包进⾏行行安装。
 
 2.具体制作步骤
   
   Yum源是Centos当中下载软件rpm包的地址，因此通过制作本地Yum源并指定Yum命令使⽤用本地Yum
源，为了了使Yum命令(本机，跨⽹网络节点)可以通过⽹网络访问到本地源，我们使⽤用Httpd这种静态资源服务
器器来开放我们下载所有的rpm包。
   1).Linux121安装Httpd服务器器
   #yum⽅方式安装httpd服务器器
    yum install httpd -y
   #启动httpd服务器器
    systemctl start httpd
   #验证httpd⼯工作是否正常,默认端⼝口是80，可以省略略
    http://linux121
   2).新建⼀一个测试⻚页⾯面
    httpd默认存放⻚页⾯面路路径
	/var/www/html/
	新建⼀一个⻚页⾯面test.html
	<html>
    <div style="font-size:100px">
    this is a new page!!
    </div>
    </html>
	访问
	http://linux121/test.html
    注：后续可以把下载的rpm包解压放置到此处便便可以供⼤大家访问。
	3).下载Impala安装所需rpm包
	Impala所需安装包需要到Cloudera提供地址下载
	http://archive.cloudera.com/cdh5/repo-as-tarball/5.7.6/cdh5.7.6-centos7.tar.gz
	注意：该tar.gz包是包含了了Cloudera所提供的⼏几乎所有rpm包，但是为了了⽅方便便我们不不再去梳理理其中
依赖关系，全部下载来，整个⽂文件⽐比较⼤大，有3.8G。 选择⼀一个磁盘空间够的节点，后续还要把压缩包解压
所以磁盘空间要剩余10G以上。该包在资料料中提供给⼤大家。
   移动该安装包到/opt/lagou/software
   解压缩
   tar -zxvf cdh5.7.6-centos7.tar.gz
   4).使⽤用Httpd盛放依赖包
   创建软链接到/var/www/html下
   ln -s /opt/lagou/software/cdh/5.7.6 /var/www/html/cdh57
   验证
   http://linux121/cdh57/
   如果提示403 forbidden
   vim /etc/selinux/config
   将SELINUX=enforcing改为SELINUX=disabled
   5).修改Yum源配置⽂文件
   cd /etc/yum.repos.d
   #创建⼀一个新的配置⽂文件
    vim local.repo
   #添加如下内容
   [local]
    name=local
    baseurl=http://linux121/cdh57/
    gpgcheck=0
    enabled=1
	name:对于当前源的描述
    baseurl:访问当前源的地址信息
    gpgcheck: 1 0,gpg校验
    enabled:1/0,是否使⽤用当前源
	6).分发local.repo⽂文件到其它节点
	rsync-script local.repo
 
 3.安装Impala
   
   1).集群规划
   服务名称            linux121 linux122 linux123
   impala-catalogd      不安装   不安装   安装
   impala-statestored   不安装   不安装   安装
   impala-server         安装     安装    安装
   Impala角色
   impala-server:这个进程是Impala真正⼯工作的进程，官⽅方建议把impala-server安装在datanode节点，
更靠近数据（短路路读取）,进程名impalad
   impala-statestored:健康监控⻆角⾊色，主要监控impala-server,impala-server出现异常时告知给其它
impala-server;进程名叫做statestored
   impala-catalogd :管理理和维护元数据(Hive),impala更更新操作；把impala-server更更新的元数据通知给其
它impala-server,进程名catalogd
   官⽅建议statestore与catalog安装在同⼀节点上！！
   2).具体安装步骤
   Linux123
   yum install impala -y
   yum install impala-server -y
   yum install impala-state-store -y
   yum install impala-catalog -y
   yum install impala-shell -y
   Linux121与Linux122
   yum install impala-server -y
   yum install impala-shell -y
   3).配置Impala
   (1).修改hive-site.xml
   vim hive-site.xml
   <!--指定metastore地址，之前添加过可以不⽤添加 -->
   <property>
             <name>hive.metastore.uris</name>
             <value>thrift://linux121:9083,thrift://linux123:9083</value>
   </property>
   <property>
             <name>hive.metastore.client.socket.timeout</name>
             <value>3600</value>
   </property>
   (2).分发Hive安装包到集群节点
   rsync -r /opt/lagou/servers/hive-2.3.7/ linux122:/opt/lagou/servers/
   rsync -r /opt/lagou/servers/hive-2.3.7/ linux121:/opt/lagou/servers/
   (3).Linux123启动metastore服务
   nohup hive --service metastore &
   启动hiveserver2服务
   nohup hive --service hiveserver2 &
   (4).修改HDFS集群hdfs-site.xml
   配置HDFS集群的短路路读取
   什么是短路路读取？
   在HDFS中通过DataNode来读取数据。但是，当客户端向DataNode请求读取⽂文件时，DataNode
就会从磁盘读取该⽂文件并通过TCP socket将数据发送到客户端。所谓“短路路”是指Client客户端直接
读取⽂文件。很明显，这种情况只在客户端与数据放在同⼀一地点（译者注：同⼀一主机）时才有可能发
⽣生。短路路读对于许多应⽤用程序会带来重⼤大的性能提升。
   短路路读取：就是Client与DataNode属于同⼀一节点，⽆无需再经过⽹网络传输数据，直接本地读取。
   要配置短路路本地读，需要验证本机Hadoop是否有libhadoop.so;
   进入一下⽬目录：/opt/lagou/servers/hadoop-2.9.2/lib/native
   能够看到libhadoop.so->libhadoop.so.1.0.1
 
 4.短路读取配置步骤
   
   1).创建短路路读取本地中转站
   #所有节点创建一下⽬目录
   mkdir -p /var/lib/hadoop-hdfs
   chown /var/lib/hadoop-hdfs
   2).修改hdfs-site.xml
   <!--添加如下内容 -->
   <!--打开短路路读取开关 -->
   <!-- 打开短路路读取配置-->
   <property>
       <name>dfs.client.read.shortcircuit</name>
       <value>true</value>
   </property>
   <!--这是⼀一个UNIX域套接字的路路径，将⽤用于DataNode和本地HDFS客户机之间的通信 -->
   <property>
       <name>dfs.domain.socket.path</name>
       <value>/var/lib/hadoop-hdfs/dn_socket</value>
   </property>
   <!--block存储元数据信息开发开关 -->
   <property>
       <name>dfs.datanode.hdfs-blocks-metadata.enabled</name>
       <value>true</value>
   </property>
   <property>
       <name>dfs.client.file-block-storage-locations.timeout</name>
       <value>30000</value>
   </property>
   注：分发到集群其它节点。重启Hadoop集群。
   #停止集群
    stop-dfs.sh
    start-dfs.sh
   #启动集群
    start-dfs.sh
    start-yarn.sh

 5.Impala具体配置
   
   引用HDFS，Hive配置
   使用Yum方式安装impala默认的Impala配置文件目录为 /etc/impala/conf，Impala的使⽤用要依赖
Hadoop，Hive框架，所以需要把Hdfs,Hive的配置文件告知Impala。
   执⾏行行以下命令把Hdfs，Hive的配置⽂文件软链接到/etc/impala/conf下
   ln -s /opt/lagou/servers/hadoop-2.9.2/etc/hadoop/core-site.xml
/etc/impala/conf/core-site.xml
   ln -s /opt/lagou/servers/hadoop-2.9.2/etc/hadoop/hdfs-site.xml
/etc/impala/conf/hdfs-site.xml
   ln -s /opt/lagou/servers/hive-2.3.7/conf/hive-site.xml
/etc/impala/conf/hive-site.xml
   注：所有节点都要执⾏行行此命令！
   Impala自身配置
   所有节点更更改Impala默认配置⽂文件以及添加mysql的驱动包
   vim /etc/default/impala
   <!--更更新如下内容 -->
   IMPALA_CATALOG_SERVICE_HOST=linux123
   IMPALA_STATE_STORE_HOST=linux123
   所有节点创建mysql的驱动包的软链接
   #创建节点
   mkdir -p /usr/share/java
   ln -s /opt/lagou/servers/hive-2.3.7/lib/mysql-connector-java-5.1.46.jar
/usr/share/java/mysql-connector-java.jar
   修改bigtop的java_home路径
   vim /etc/default/bigtop-utils
   export JAVA_HOME=/opt/lagou/servers/jdk1.8.0_231
   注意：Apache Bigtop 是⼀一个针对基础设施⼯工程师和数据科学家的开源项⽬目，旨在全⾯面打包、测试
和配置领先的开源⼤大数据组件/项⽬目。Impala项⽬目中使⽤用到了此软件。
   启动Impala
   #linux123启动如下⻆角⾊色
   service impala-state-store start
   service impala-catalog start
   service impala-server start
   #其余节点启动如下⻆角⾊色
   service impala-server start
   验证Impala启动结果
   ps -ef | grep impala
   [root@linux123 conf]# ps -ef | grep impala
impala 29212 1 1 23:42 ? 00:00:00
/usr/lib/impala/sbin/statestored -log_dir=/var/log/impala -
state_store_port=24000
impala 29249 1 21 23:42 ? 00:00:04
/usr/lib/impala/sbin/catalogd -log_dir=/var/log/impala
impala 29341 1 30 23:42 ? 00:00:06
/usr/lib/impala/sbin/impalad -log_dir=/var/log/impala -
catalog_service_host=linux123 -state_store_port=24000 -use_statestore -
state_store_host=linux123 -be_port=22000
    
	[root@linux122 conf]# ps -ef | grep impala
impala 25233 1 41 23:43 ? 00:00:04
/usr/lib/impala/sbin/impalad -log_dir=/var/log/impala -
catalog_service_host=linux123 -state_store_port=24000 -use_statestore -
state_store_host=linux123 -be_port=22000
     
	 [root@linux121 conf]# ps -ef | grep impala
impala 21992 1 59 23:43 ? 00:00:04
/usr/lib/impala/sbin/impalad -log_dir=/var/log/impala -
catalog_service_host=linux123 -state_store_port=24000 -use_statestore -
state_store_host=linux123 -be_port=22000
     浏览器Web界面验证
	 访问impalad的管理理界⾯面
     http://linux123:25000/
     访问statestored的管理理界⾯面
     http://linux123:25010/
	 注意：启动之后所有关于Impala的⽇日志默认都在/var/log/impala 这个路路径下，Linux123机器器上⾯面
应该有三个进程，Linux121与Linux122机器器上⾯面只有⼀一个进程，如果进程个数不不对，去对应⽬目录
下查看报错⽇日志.
 
 6.消除Impala影响
   
   由于使⽤用Yum命令安装Impala，我们选择使⽤用yum⾃自动进⾏行行Impala依赖的安装和处理理，所以本次安装
默认会把Impala依赖的所有框架都会安装，⽐比如Hadoop,Hive,Mysql等，为了了保证我们⾃自⼰己安装的
Hadoop等使⽤用正常我们需要删除掉Impala默认安装的其它框架
   [root@linux122 conf]# which hadoop
    /usr/bin/hadoop
   [root@linux122 conf]# which hive
    /usr/bin/hive
	#使⽤用which命令 查找hadoop,hive等会发现，命令⽂文件是/usr/bin/hadoop ⽽而⾮非我们⾃自⼰己安装的路路
    #径，需要把这些删除掉,所有节点都要执⾏行
	rm -rf /usr/bin/hadoop
    rm -rf /usr/bin/hdfs
    rm -rf /usr/bin/hive
    rm -rf /usr/bin/beeline
    rm -rf /usr/bin/hiveserver2
	#重新⽣生效环境变量量
    source /etc/profile
	jps 时出现没有名字的进程 或者process information unavailable
	解决方式
	rm -rf /tmp/hsperfdata_*
 
 7.Impala入门案例
   
   使⽤用Yum⽅方式安装Impala后，impala-shell可以全局使⽤用；进⼊入impala-shell命令⾏行行
   impala-shell进⼊入到impala的交互窗⼝口
   [root@linux123 conf]# impala-shell
   Connected to linux123:21000
   Server version: impalad version 2.3.0-cdh5.5.0 RELEASE (build
0c891d79aa38f297d244855a32f1e17280e2129b)
******************************************************************************
*****
   Welcome to the Impala shell. Copyright (c) 2015 Cloudera, Inc. All rights
reserved.
  (Impala Shell v2.3.0-cdh5.5.0 (0c891d7) built on Mon Nov 9 12:18:12 PST 2015)
The SET command shows the current value of all shell and query options.
******************************************************************************
*****
   [linux123:21000] >
   查看所有数据库
   show databases;
   Fetched 0 row(s) in 4.74s
   [linux123:21000] > show databases;
  Query: show databases
   name |
+------------------+
| _impala_builtins |
|  default
   如果想要使⽤用Impala ,需要将数据加载到Impala中，如何加载数据到Impala中呢？
   使用Impala的外部表，这种适⽤用于已经有数据⽂文件，只需将数据⽂文件拷⻉贝到HDFS上，创建⼀一张
Impala外部表，将外部表的存储位置指向数据⽂文件的位置即可。（类似Hive）
   通过Insert方式插⼊入数据，适⽤用于我们没有数据⽂文件的场景。
   1).准备数据文件
   user.csv
392456197008193000,张三,20,0
267456198006210000,李四,25,1
892456199007203000,王五,24,1
492456198712198000,赵六,26,2
392456197008193000,张三,20,0
392456197008193000,张三,20,0
   2).创建HDFS 存放数据的路径
   hadoop fs -mkdir -p /user/impala/t1
   #上传本地user.csv到hdfs /user/impala/table1
   hadoop fs -put user.csv /user/impala/t1
   3).创建表
   #进入impala-shell
    impala-shell
   #表如果存在则删除
    drop table if exists t1;
   #执行创建
   create external table t1(id string,name string,age int,gender int)
row format delimited fields terminated by ','
location '/user/impala/t1';
   4).查询数据
   [linux122:21000] > select * from t1;
   Query: select * from t1
+--------------------+------+-----+--------+
| id | name | age | gender |
+--------------------+------+-----+--------+
| 392456197008193000 | 张三 | 20 | 0 |
| 267456198006210000 | 李李四 | 25 | 1 |
| 892456199007203000 | 王五 | 24 | 1 |
| 492456198712198000 | 赵六 | 26 | 2 |
| 392456197008193000 | 张三 | 20 | 0 |
| 392456197008193000 | 张三 | 20 | 0 |
+--------------------+------+-----+--------+
   5).创建t2表
   #创建⼀一个内部表
create table t2(id string,name string,age int,gender int)
row format delimited fields terminated by ',';
   #查看表结构
    desc t1;
    desc formatted t2;
   6).插入数据到t2
   insert overwrite table t2 select * from t1 where gender =0;
   #验证数据
   select * from t2;
   [linux122:21000] > select * from t2;
    Query: select * from t2
+--------------------+------+-----+--------+
| id | name | age | gender |
+--------------------+------+-----+--------+
| 392456197008193000 | 张三 | 20 | 0 |
| 392456197008193000 | 张三 | 20 | 0 |
| 392456197008193000 | 张三 | 20 | 0 |
+--------------------+------+-----+--------+
    更新元数据
    使用Beeline连接Hive查看Hive中的数据，发现通过Impala创建的表，导⼊入的数据都可以被Hive感
知到。
    0: jdbc:hive2://linux123:10000> show tables;
+-----------+
| tab_name |
+-----------+
| t1 |
| t2 |
+-----------+
    select * from t1;
    0: jdbc:hive2://linux123:10000> select * from t1;
+---------------------+----------+---------+------------+
| t1.id | t1.name | t1.age | t1.gender |
+---------------------+----------+---------+------------+
| 392456197008193000 | 张三 | 20 | 0 |
| 267456198006210000 | 李李四 | 25 | 1 |
| 892456199007203000 | 王五 | 24 | 1 |
| 492456198712198000 | 赵六 | 26 | 2 |
| 392456197008193000 | 张三 | 20 | 0 |
| 392456197008193000 | 张三 | 20 | 0 |
+---------------------+----------+---------+------------+
    小结：
	1).上⾯面案例例中Impala的数据⽂文件我们准备的是以逗号分隔的⽂文本⽂文件，实际上，Impala可以⽀支
持RCFile,SequenceFile,Parquet等多种⽂文件格式。
    2).Impala与Hive元数据的关系？
    Hive对于元数据的更更新操作不不能被Impala感知到；
    Impala对元数据的更更新操作可以被Hive感知到。
	Impala同步Hive元数据命令：
    手动执⾏行行invalidate metadata ，（后续详细讲解）
	Impala是通过Hive的metastore服务来访问和操作Hive的元数据，但是Hive对表进⾏行行创建删
除修改等操作，Impala是⽆无法⾃自动识别到Hive中元数据的变更更情况的，如果想让Impala识别
到Hive元数据的变化，所以需要进⼊入impala-shell之后⾸首先要做的操作就是执⾏行行invalidate
metadata,该命令会将所有的Impala的元数据失效并重新从元数据库同步元数据信息。后⾯面
详细讲解元数据更更新命令。
    3).Impala操作HDFS使⽤用的是Impala用户，所以为了避免权限问题，我们可以选择关闭权限校验
	在hdfs-site.xml中添加如下配置：
	<!--关闭hdfs权限校验 -->
    <property>
        <name>dfs.permissions.enabled</name>
        <value>false</value>
    </property>